package cn.hinglo.gameclaw.alipay.service;

import cn.hinglo.gameclaw.admin.service.OderService;
import cn.hinglo.gameclaw.alipay.utils.AlipayUtils;
import cn.hinglo.gameclaw.alipay.utils.WeixinUtils;
import cn.hinglo.gameclaw.client.service.GrabNoteService;
import cn.hinglo.gameclaw.data.utils.FieldUtils;
import cn.hinglo.gameclaw.user.bean.GrabNote;
import cn.hinglo.gameclaw.user.bean.Orders;
import cn.hutool.core.date.DateUtil;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @createTime: 2018/5/31
 * @author: HingLo
 * @description: 物流订单下单的处理服务层
 */
@Service
@Slf4j
public class LogisticsOrderService {

    private static final String NOTIFY_URL_ALIPAY = "/pay/l/moneyNotifyAlipay";
    private static final String NOTIFY_URL_WEIXIN = "/pay/l/moneyNotifyWeixin";
    @Autowired
    private GrabNoteService grabNoteService;
    @Autowired
    private OderService oderService;

    /**
     * 支付宝支付下单通知
     *
     * @param id
     * @param userId
     * @param addressId
     * @return
     */
    public String logisticsAlipayOrderService(String id, String userId, Long addressId) {
        //生成一个订单
        Orders order = createLogisticsOrder(id, userId, addressId, FieldUtils.PAYMENT_1);
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        //对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
        model.setBody(order.getBody());
        //商品的标题/交易标题/订单标题/订单关键字等。
        model.setSubject(order.getSubject());
        //订单的编号
        model.setOutTradeNo(order.getId());
        //订单有效期该笔订单允许的最晚付款时间，逾期将关闭交易。取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。 该参数数值不接受小数点， 如 1.5h，可转换为 90m。
        model.setTimeoutExpress("30m");
        //充值的金额
        model.setTotalAmount(order.getNum().toString());
        // 销售产品码，商家和支付宝签约的产品码，为固定值  QUICK_MSECURITY_PAY
        model.setProductCode("QUICK_MSECURITY_PAY");
        // 商品主类型 :0-虚拟类商品,1-实物类商品
        model.setGoodsType("0");
        return AlipayUtils.order(model, FieldUtils.URL + NOTIFY_URL_ALIPAY);
    }

    /**
     * 支付宝充值结果通知信息
     *
     * @param request request
     * @return 是否充值成
     */
    public boolean logisticsAlipayNotifyService(HttpServletRequest request) {
        Map<String, String> result = AlipayUtils.validate(request);
        if (result != null) {
            //获取订单号码
            String orderId = result.get("out_trade_no");
            //付款时间
            String pd = result.get("gmt_payment");
            Date payDate = DateUtil.parse(pd);
            log.info("通过订单编号为：{}", orderId);
            return oderService.markOrderService(orderId, payDate, FieldUtils.PAYMENT_1);
        } else {
            log.info("通知校验失败");
            return false;
        }
    }


    //***********************************微信下单****************************************//

    /**
     * 微信下单
     *
     * @param id
     * @param userId
     * @param addressId
     * @param remortIP
     * @return
     */
    public String logisticsWeixinOrderService(String id, String userId, Long addressId, String remortIP) {
        //生成一个订单
        Orders order = createLogisticsOrder(id, userId, addressId, FieldUtils.PAYMENT_2);
        if (order == null) {
            return null;
        }
        Map<String, String> data = new HashMap<>(7);
        data.put("body", order.getBody());
        data.put("out_trade_no", order.getId());
        // 货币类型
        data.put("fee_type", "CNY");
        // 支付金额
        data.put("total_fee", String.valueOf(100 * order.getNum()));
        // 用户端实际ip
        data.put("spbill_create_ip", remortIP);
        //回调通知URL
        data.put("notify_url", FieldUtils.URL + NOTIFY_URL_WEIXIN);
        // 此处指定为APP 支付
        data.put("trade_type", "APP");
        try {
            return WeixinUtils.order(data);
        } catch (Exception e) {
            throw new RuntimeException("订单创建失败");
        }

    }

    /**
     * 微信支付结果过通知
     *
     * @param request
     * @return
     */
    public boolean logisticsWeixinNotifyService(HttpServletRequest request) {
        try {
            Map<String, String> result = WeixinUtils.validate(request);
            if (result == null) {
                return false;
            } else {
                String orderId = result.get("out_trade_no");
                //付款时间
                String pd = result.get("time_end");
                Date payDate = DateUtil.parse(pd);
                //微信支付得不到微信支付的账号 默认为null
                log.info("微信通知邮费订单编号为：{}", orderId);
                return oderService.markOrderService(orderId, payDate, FieldUtils.PAYMENT_2);

            }
        } catch (Exception e) {
            log.info("微信邮费订单通知信息校验失败");
            return false;
        }
    }

    //*********************************支付宝与微信统一下单****************************************//

    /***
     *  下单
     * @param id 下单的数量集合
     * @param userId 用户
     * @param addressId 发货地址
     * @param payment 支付方式
     * @return 返回订单信息
     */
    private Orders createLogisticsOrder(String id, String userId, Long addressId, int payment) {
        String[] ids = id.split(",");
        //根据抓取记录Id的集合来查询抓取记录的信息
        List<GrabNote> list = grabNoteService.orderGrabNoteService(ids, userId);
        if (list.size() == ids.length) {
            return oderService.createOrderService(list, userId, addressId, payment);
        } else {
            return null;
        }
    }

    /**
     * 包邮下单
     *
     * @param id        抓取记录集合
     * @param userId    用户ID
     * @param addressId 地址
     * @return
     */
    public boolean notFreeService(String id, String userId, Long addressId) {
        //设置默认的支付方式为0，即免费
        return createLogisticsOrder(id, userId, addressId, 0) == null;
    }
}
